/********************************************
 * 功能说明: 
 * 模块名称: 
 * 系统名称: 
 * 软件版权: 
 * 系统版本: 1.0.0
 * 开发人员: Frank
 * 开发时间: 2019/10/13 20:58
 * 审核人员: 
 * 相关文档: 
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.spring.arch.common.setup;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;

/**
 * 初始化执行
 *
 * @author Frank
 * @version 1.0.0.1
 * @since 2019/10/13 20:58
 */
@Slf4j
@Component
public class ApplicationSetup implements ApplicationContextAware {

    //Spring Bean上下文
    private ApplicationContext applicationContext;

    private HashMap<Integer, IApplicationSetup> beanSortMap = new HashMap<>();

    public void init(String... args) {

        //获取所有初装Bean对象，按顺序执行
        //1. 获取所有初装对象
        Map<String, Object> beans = this.applicationContext.getBeansWithAnnotation(SetupOrder.class);

        //2. 加入到SortedMap 中
        beans.forEach((key, value) -> {
            IApplicationSetup bean = (IApplicationSetup) value;
            SetupOrder setupOrder = AnnotationUtils.findAnnotation(value.getClass(), SetupOrder.class);
            if (setupOrder == null) {
                log.error("[{}] 获取初始化程序SetupOrder注解为空！！！", value.getClass().getSimpleName());
            } else {
                beanSortMap.put(setupOrder.value(), bean);
            }
        });

        //3. 按顺序执行
        beanSortMap.entrySet().stream()
                .sorted(Comparator.comparing(Map.Entry::getKey))
                .forEach((entry) -> {
                    try {
                        boolean res = entry.getValue().initDBData(args);
                        if (!res) {
                            log.error(">>>>>>>>[{}]初始化失败！！！", entry.getValue().getClass().getSimpleName());
                        }
                    } catch (Exception e) {
                        log.error(">>>>>>>>[{}]初始化异常！！！", entry.getValue().getClass().getSimpleName(), e);
                    }
                });
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

}
